package com.tbit.main.service;

import com.tbit.main.pojo.*;

import java.util.List;
import java.util.Map;

/**
 * 设备最后状态
 *
 * @author Leon
 * 2019年11月11日 上午10:59:53
 */
public interface MachineStatusService {

    /**
     * 根据设备id查询
     *
     * @param machineId
     * @return
     */
    MachineStatus getByMachineId(Integer machineId);

    /**
     * 根据设备id批量查询 最后状态
     *
     * @param machineIds
     * @return
     */
    List<MachineStatus> getByMachineIdBatch(List<Integer> machineIds);

    /**
     * 根据设备id批量查询  最后借出信息
     *
     * @param machineIds
     * @return
     */
    List<MachineStatusBorrow> getBorrowByMachineIds(List<Integer> machineIds, Integer state);

    /**
     * 根据代理商id查询
     *
     * @param accountId
     * @return
     */
    List<MachineStatus> getByAccountId(Integer accountId);

    /**
     * 根据分区id查询
     *
     * @param regionId
     * @return
     */
    List<MachineStatus> getByRegionIds(List<Integer> regionId);

    /**
     * 查询代理商低电量设备
     *
     * @param accountId
     * @param socPercent
     * @return
     */
    List<MachineStatus> getSocByAccountId(Integer accountId, Integer socPercent);

    /**
     * 查询指定区域指定区间电量设备
     *
     * @param accountId
     * @param startSoc
     * @param endSoc
     * @return
     */
    List<MachineStatus> getSocByKey(Integer accountId, Integer startSoc, Integer endSoc);

    /**
     * 查询指定区间分区电量
     *
     * @param regionId
     * @param startSoc
     * @param endSoc
     * @return
     */
    List<MachineStatus> getSocByRegionIdAndKey(List<Integer> regionId, Integer startSoc, Integer endSoc);


    /**
     * 获取状态和最后借出信息
     *
     * @param accountId
     * @return
     */
    List<MachineStatusBorrow> getUnUseByStartEnd(Integer accountId, String start, String end);

    /**
     * 获取闲置时长区间的设备
     *
     * @param accountId 区域编号
     * @param startIdleTime 闲置时长开始区间（单位：小时）
     * @param endIdleTime 闲置时长结束区间（单位：小时）
     * @return 闲置时长区间的设备
     */
    List<MachineStatusBorrow> getAccountIdleTimeByStartEnd(Integer accountId, Integer startIdleTime, Integer endIdleTime);

    /**
     * 获取闲置时长区间的设备
     *
     * @param regionId 分区编号列表
     * @param startIdleTime 闲置时长开始区间（单位：小时）
     * @param endIdleTime 闲置时长结束区间（单位：小时）
     * @return 闲置时长区间的设备
     */
    List<MachineStatusBorrow> getRegionIdleTimeByStartEnd(List<Integer> regionId, Integer startIdleTime, Integer endIdleTime);

    /**
     * 获取状态和最后借出信息
     *
     * @param regionId
     * @return
     */
    List<MachineStatusBorrow> getRegionByStartEnd(List<Integer> regionId, String start, String end);

    /**
     * 查询代理商低电量设备
     *
     * @param accountIds
     * @param socPercent
     * @return
     */
    List<MachineStatus> getSocByAccountIds(List<Integer> accountIds, Integer socPercent);

    /**
     * 查询分区低电量设备
     *
     * @param regionId
     * @param socPercent
     * @return
     */
    List<MachineStatus> getSocByRegionId(List<Integer> regionId, Integer socPercent);

    /**
     * 查询代理商低电量设备总数
     *
     * @param accountId
     * @param socPercent
     * @return
     */
    Integer getSocByAccountIdCount(Integer accountId, Integer socPercent);

    /**
     * 获取状态和最后借出信息
     *
     * @param accountId
     * @param lastBorrowTime
     * @return
     */
    List<MachineStatusBorrow> getUnUseByAccountId(Integer accountId, String lastBorrowTime);

    /**
     * 获取状态和最后借出信息
     *
     * @param regionId
     * @param lastBorrowTime
     * @return
     */
    List<MachineStatusBorrow> getUnUseByRegionId(List<Integer> regionId, String lastBorrowTime);

    /**
     * 获取状态和最后借出信息
     *
     * @return
     */
    List<MachineStatusBorrow> getStatusAll();

    /**
     * 获取故障车辆
     *
     * @param accountId
     * @return
     */
    List<MachineStatus> getFaultByAccountId(Integer accountId, List<Integer> from);

    /**
     * 获取故障车辆
     *
     * @param regionId
     * @return
     */
    List<MachineStatus> getFaultByRegionId(List<Integer> regionId, List<Integer> from);

    /**
     * 根据运营区域批量查询
     *
     * @param orderJobs
     * @return
     */
    List<MachineStatusBorrow> getUnUseByAccountIdList(List<OrderJob> orderJobs);

    /**
     * 根据运营区域批量查询
     *
     * @param liatAccountId
     * @return
     */
    List<MachineStatus> getByListAccountId(List<Integer> liatAccountId);

    /**
     * 根据运营区域id批量查询
     *
     * @param accountId
     * @return
     */
    List<Machine> getByAccountIdAll(List<Integer> accountId);

    /**
     * 获取运营区域内的异常车辆数
     *
     * @return
     */
    List<Map<String, Object>> getGroupByAccountIdLockPower();

    /**
     * 根据最后上报定位时间查询
     *
     * @param posDt
     * @return
     */
    List<Integer> getByPosDt(String posDt);

    /**
     * 根据区域和最后上报时间
     *
     * @param accountIds
     * @param posDt
     * @return
     */
    List<MachineStatus> getAccountIdsPosDt(List<Integer> accountIds, String posDt);

    /**
     * 根据最后心跳时间查询
     *
     * @param batDt
     * @return
     */
    List<Machine> getByBatDt(Integer accountId, String batDt, Integer batteryEU);

    /**
     * 根据最后心跳时间查询
     *
     * @param batDt
     * @return
     */
    Integer getByBatDtId(Integer machineId, String batDt);


    /**
     * 根据最后上报定位时间,运营区域id查询
     *
     * @param posDt
     * @return
     */
    List<Machine> getByAccountIdPosDt(String posDt, Integer accountId);

    /**
     * 获取所有车辆状态
     *
     * @return
     */
    List<MachineStatus> getMachineStatusAll();


    /**
     * 查询流入流出车辆
     *
     * @param regionId
     * @return
     */
    List<MachineStatus> getStream(List<Integer> regionId);

    /**
     * 根据区域查询未分区车辆
     *
     * @param accountIds
     * @return
     */
    List<MachineStatus> getAccountIdNotRegionId(List<Integer> accountIds, String posDt);

    /**
     * 查询区域内在骑车辆状态
     *
     * @param accountId
     * @return
     */
    List<Integer> getAccountIdBorrow(Integer accountId, Integer startSoc, Integer endSoc);

    /**
     * 查询设备是否低电
     *
     * @param list
     * @param soc
     * @return
     */
    List<Integer> getExist(List<Integer> list, Integer soc);

    /**
     * 修改定位
     *
     * @param point
     * @param machineId
     */
    void updateStatus(Point point, List<Integer> machineId, Integer posType);

    /**
     * 批量修改定位
     * @param machineStatusPosList 修改信息
     */
    void updateStatusPosBatch(List<MachineStatusPos> machineStatusPosList);

    /**
     * 添加
     *
     * @param
     */
    void insert(Integer machineId, Point point, Integer posType);

    /**
     * 根据自定义标签查询车辆
     *
     */
    List<MachineStatus> getByTag(int accountId,List<Integer> regionId, List<Integer> tagIds);

    /**
     * 无定位
     */
    List<MachineStatus> getLongTermNonPos(Integer accountId, List<Integer> regionId, Integer hours);

    /**
     * 长时订单
     */
    List<MachineStatus> getLongOrder(Integer accountId, List<Integer> regionId, Integer hours);

    /**
     * 无订单
     * @param accountId 区域id
     * @param regionId  分区id
     * @param hours     小时
     * @return  List<MachineStatus>
     */
    List<MachineStatus> getNoOrder(Integer accountId, List<Integer> regionId, Integer hours);
}